window: Hide frame buttons when appropriate
authorMatthias Clasen <mclasen@redhat.com>
Sun, 10 Mar 2013 03:28:39 +0000 (22:28 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 17 Mar 2013 16:19:49 +0000 (12:19 -0400)
Hide the close button if the window is not deletable, hide the
maximize button if the window is not resizable, and hide all
buttons if the window is a dialog.

Update buttons when the window state changes.

gtk/gtkwindow.c

index 968655dcab0e59e60e582e393613c1281264dbaf..a6bfa201d4ca05b5e21c5727f62c4178c34e90e2 100644 (file)
@@ -435,6 +435,7 @@ static void     gtk_window_unrealize_icon             (GtkWindow    *window);
 static void     resize_grip_create_window             (GtkWindow    *window);
 static void     resize_grip_destroy_window            (GtkWindow    *window);
 static void     update_grip_visibility                (GtkWindow    *window);
+static void     update_window_buttons                 (GtkWindow    *window);
 
 static void        gtk_window_notify_keys_changed (GtkWindow   *window);
 static GtkKeyHash *gtk_window_get_key_hash        (GtkWindow   *window);
@@ -2901,6 +2902,8 @@ gtk_window_set_type_hint (GtkWindow           *window,
 
   priv->reset_type_hint = TRUE;
   priv->gdk_type_hint = hint;
+
+  update_window_buttons (window);
 }
 
 /**
@@ -3414,6 +3417,9 @@ gtk_window_set_decorated (GtkWindow *window,
                                     0);
     }
 
+  update_window_buttons (window);
+  gtk_widget_queue_resize (GTK_WIDGET (window));
+
   g_object_notify (G_OBJECT (window), "decorated");
 }
 
@@ -3481,6 +3487,8 @@ gtk_window_set_deletable (GtkWindow *window,
                                  GDK_FUNC_ALL | GDK_FUNC_CLOSE);
     }
 
+  update_window_buttons (window);
+
   g_object_notify (G_OBJECT (window), "deletable");  
 }
 
@@ -4854,6 +4862,52 @@ get_default_title (void)
   return title;
 }
 
+static void
+update_window_buttons (GtkWindow *window)
+{
+  GtkWindowPrivate *priv = window->priv;
+
+  if (priv->client_decorated)
+    {
+      if (priv->title_box != NULL)
+        gtk_widget_show (priv->title_box);
+
+      if (priv->title_min_button != NULL)
+        {
+          if (priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+            gtk_widget_show (priv->title_min_button);
+          else
+            gtk_widget_hide (priv->title_min_button);
+        }
+
+      if (priv->title_max_button != NULL)
+        {
+          if (priv->resizable &&
+              priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+            gtk_widget_show (priv->title_max_button);
+          else
+            gtk_widget_hide (priv->title_max_button);
+        }
+
+     if (priv->title_close_button != NULL)
+        {
+          if (priv->deletable &&
+              priv->gdk_type_hint == GDK_WINDOW_TYPE_HINT_NORMAL)
+            gtk_widget_show_all (priv->title_close_button);
+          else
+            gtk_widget_hide (priv->title_close_button);
+        }
+
+      if (priv->title_label != NULL)
+        gtk_widget_show (priv->title_label);
+    }
+  else
+    {
+      if (priv->title_box != NULL)
+        gtk_widget_hide (priv->title_box);
+    }
+}
+
 static void
 create_decoration (GtkWidget *widget)
 {
@@ -4926,6 +4980,8 @@ create_decoration (GtkWidget *widget)
                     G_CALLBACK (gtk_window_title_close_clicked), window);
 
   gtk_widget_show_all (priv->title_box);
+
+  update_window_buttons (window);
 }
 
 static void
@@ -5933,6 +5989,12 @@ gtk_window_state_event (GtkWidget           *widget,
         gtk_widget_set_visible (priv->title_box, !priv->fullscreen);
     }
 
+  if (event->changed_mask & (GDK_WINDOW_STATE_FULLSCREEN | GDK_WINDOW_STATE_MAXIMIZED))
+    {
+      update_window_buttons (window);
+      gtk_widget_queue_draw (GTK_WIDGET (window));
+    }
+
   return FALSE;
 }
 
@@ -8735,6 +8797,7 @@ gtk_window_set_resizable (GtkWindow *window,
       priv->resizable = resizable;
 
       update_grip_visibility (window);
+      update_window_buttons (window);
 
       gtk_widget_queue_resize_no_redraw (GTK_WIDGET (window));